package com.example.closure
/**
 * ˈkləʊʒə 
 * 闭包是一个短的匿名代码块。它通常跨越几行代码。一个方法甚至可以将代码块作为参数。它们是匿名的。
 * @author 36466
 *
 */
class ClosureDemo {
	
	static void main(String[] args) {
		def clos = {println "Hello World"}
		clos.call();
		
	
		//闭包中的形式参数
		def clos2 = {param->println "Hello ${param}"};
		clos2.call("World");

		def clos3 = {p -> println "Hello ${p}"};
		clos3.call("zhangwei");	
		
		def str1 = "Hello";
		def clos4 = {param -> println "${str1} ${param}"}
		clos4.call("Wold");
		str1 = "Welcome";
		clos4.call("ZhangWei")
		
		/**
		 * 集合和字符串中的闭包
		 * 使用闭包和列表
		 */
		def lst = [11,12,13,14,15,8];
		lst.each { println it }
		for (i in lst) {
			println(i)
		}
		println("lamda表达式做一些简单的逻辑处理,打印偶数")
		lst.each { num -> if(num %2 ==0) println num }
		
		//映射闭包
		def mp = ["TopicName" : "Maps", "TopicDescription" : "Methods in Maps"]
		mp.each {println it}
		mp.each {println "${it.key} maps to: ${it.value}"}
		
		//闭包中关于find ,find all的用法
		def value = lst.find { e -> e>2 } //find只要找到一个符合条件的值
		println value;
		
		def value2 = lst.findAll{e -> e > 13} //findall会知道到符合条件的所有值
		println value2
		
		
		//方法any迭代集合的每个元素，检查布尔谓词是否对至少一个元素有效。
		println(lst.any { e -> e > 13 }) //返回表示有13的元素，返回true
		println(lst.any { e -> e > 20 }) //表示是否有大于20的元素，返回false
		
		//evevy
		println(lst.every { e -> e > 1 }) //every表示所有的元素都要大于1，才是True
		println(lst.every { e -> e > 20 })//只要有一个元素不符合大于20，都是False
		
		//Groovy collect()方法:该方法通过集合收集迭代，使用闭包作为变换器将每个元素转换为新值。
		
		def lst2 = [1,2,3,4];
		def newlst = []
		newlst = lst2.collect { e -> return e * e } //闭包变换器，这里变幻的规则是请平方
		println newlst
		
	}
	
}
